#!/usr/bin/env node

const fs = require('fs');
const https = require('https');
const path = require('path');

// 配置文件路径
const DEPENDENCIES_DIR = fs.existsSync('/ql/data/deps') ? '/ql/data/deps' : '/ql/deps';
const SEND_NOTIFY_FILE = path.join(DEPENDENCIES_DIR, 'sendNotify.js');

// 定义多个下载源（按优先级顺序）
const DOWNLOAD_SOURCES = [
    // 国内镜像源（首选）
    'https://g.wanbe.win/https://raw.githubusercontent.com/ccwav/QLScript2/main/sendNotify.js',
    'https://hub.gitmirror.com/raw.githubusercontent.com/ccwav/QLScript2/main/sendNotify.js',
    'https://raw.fastgit.org/ccwav/QLScript2/raw/main/sendNotify.js',
    
    // 原始 GitHub 源（备用）
    'https://raw.githubusercontent.com/ccwav/QLScript2/main/sendNotify.js'
];

// 获取当前格式化时间
function getCurrentTime() {
    const now = new Date();
    return `${now.getFullYear()}-${(now.getMonth() + 1).toString().padStart(2, '0')}-${now.getDate().toString().padStart(2, '0')} ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}`;
}

// 改进的版本提取函数
function extractVersion(content) {
    // 尝试多种可能的版本号格式
    
    // 格式1: @version x.x.x
    let match = content.match(/@version\s+([\d.]+)/);
    if (match) return match[1];
    
    // 格式2: 加载sendNotify，当前版本: x.x.x
    match = content.match(/加载sendNotify[^]*?当前版本:\s*([\d.]+)/);
    if (match) return match[1];
    
    // 格式3: version: x.x.x
    match = content.match(/version:\s*([\d.]+)/i);
    if (match) return match[1];
    
    // 格式4: 其他可能的版本格式
    match = content.match(/(\d+\.\d+\.\d+)/);
    if (match) return match[1];
    
    return null;
}

// 主函数
async function main() {
    const startTime = getCurrentTime();
    console.log(`🚀 [${startTime}] 开始更新 sendNotify.js`);
    
    try {
        // 确保依赖目录存在
        if (!fs.existsSync(DEPENDENCIES_DIR)) {
            fs.mkdirSync(DEPENDENCIES_DIR, { recursive: true });
            console.log(`📁 已创建目录: ${DEPENDENCIES_DIR}`);
        }
        
        // 尝试获取本地版本号
        let localVersion = null;
        if (fs.existsSync(SEND_NOTIFY_FILE)) {
            try {
                const localContent = fs.readFileSync(SEND_NOTIFY_FILE, 'utf8');
                localVersion = extractVersion(localContent);
                
                if (localVersion) {
                    console.log(`📄 本地版本: v${localVersion}`);
                } else {
                    console.log('⚠️ 无法获取本地版本号，将强制更新');
                }
            } catch (e) {
                console.log('⚠️ 本地文件读取失败，将继续更新');
            }
        }
        
        // 尝试多个下载源获取最新内容
        let latestContent = null;
        let usedSource = '';
        
        for (const source of DOWNLOAD_SOURCES) {
            try {
                console.log(`⬇️  尝试下载: ${source}`);
                latestContent = await downloadFile(source);
                usedSource = source;
                break; // 成功下载则跳出循环
            } catch (error) {
                console.log(`⚠️ 下载源不可用: ${source} (${error.message})`);
            }
        }
        
        if (!latestContent) {
            throw new Error('所有下载源均不可用');
        }
        
        // 验证内容
        if (!isValidContent(latestContent)) {
            throw new Error('下载内容验证失败');
        }
        
        // 获取最新版本号
        const latestVersion = extractVersion(latestContent);
        
        if (latestVersion) {
            console.log(`🌐 最新版本: v${latestVersion}`);
        } else {
            console.log('⚠️ 无法获取最新版本号，将继续更新');
        }
        
        // 版本比对（只有在两者版本号都存在时才跳过）
        let skipUpdate = false;
        if (localVersion && latestVersion && localVersion === latestVersion) {
            console.log(`✅ 当前已是最新版本 v${localVersion}，无需更新`);
            skipUpdate = true;
        }
        
        // 如果版本号匹配或者无法提取版本号但验证通过，则写入新文件
        if (!skipUpdate) {
            // 写入新文件
            fs.writeFileSync(SEND_NOTIFY_FILE, latestContent);
            
            // 显示成功信息
            const updateTime = getCurrentTime();
            console.log(`✅ 更新成功！更新时间: ${updateTime}`);
            
            if (localVersion && latestVersion) {
                console.log(`🔄 版本变化: v${localVersion} → v${latestVersion}`);
            }
            
            console.log(`📁 文件路径: ${SEND_NOTIFY_FILE}`);
            console.log(`🌐 下载源: ${usedSource}`);
        }
        
    } catch (error) {
        console.error(`❌ 更新失败: ${error.message} (${getCurrentTime()})`);
        process.exit(1);
    }
}

// 文件下载函数
function downloadFile(url) {
    return new Promise((resolve, reject) => {
        https.get(url, (response) => {
            // 处理重定向
            if (response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
                return resolve(downloadFile(response.headers.location));
            }
            
            if (response.statusCode !== 200) {
                return reject(new Error(`HTTP ${response.statusCode}`));
            }
            
            let data = [];
            response.on('data', chunk => data.push(chunk));
            response.on('end', () => {
                resolve(Buffer.concat(data).toString('utf8'));
            });
            
        }).on('error', reject);
    });
}

// 内容验证
function isValidContent(content) {
    // 检查是否存在关键函数和作者标识
    const hasFunction = content.includes('function sendNotify');
    const hasAuthor = content.includes('ccwav');
    const isLargeEnough = content.length > 1024; // 确保文件足够大
    
    if (!hasFunction) console.log('⚠️ 警告: 缺少 sendNotify 函数');
    if (!hasAuthor) console.log('⚠️ 警告: 缺少作者标识');
    if (!isLargeEnough) console.log(`⚠️ 警告: 文件过小 (${content.length} 字节)`);
    
    return hasFunction && hasAuthor && isLargeEnough;
}

// 执行主函数
main().catch(err => {
    console.error(`❌ 未处理的错误: ${err.message} (${getCurrentTime()})`);
    process.exit(1);
});